#include "sys.h"
#include "cli.h"

//US keyboard layout
char KB_Layout[128] =
{
    0,  27, '1', '2', '3', '4', '5', '6', '7', '8',	/* 9 */
  '9', '0', '-', '=', '\b',	/* Backspace */
  '\t',			/* Tab */
  'q', 'w', 'e', 'r',	/* 19 */
  't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n',	/* Enter key */
    0,			/* 29   - Control */
  'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',	/* 39 */
 '\'', '`',   0,		/* Left shift */
 '\\', 'z', 'x', 'c', 'v', 'b', 'n',			/* 49 */
  'm', ',', '.', '/',   0,				/* Right shift */
  '*',
    0,	/* Alt */
  ' ',	/* Space bar */
    0,	/* Caps lock */
    0,	/* 59 - F1 key ... > */
    0,   0,   0,   0,   0,   0,   0,   0,
    0,	/* < ... F10 */
    0,	/* 69 - Num lock*/
    0,	/* Scroll Lock */
    0,	/* Home key */
    0,	/* Up Arrow */
    0,	/* Page Up */
  '-',
    0,	/* Left Arrow */
    0,
    0,	/* Right Arrow */
  '+',
    0,	/* 79 - End key*/
    0,	/* Down Arrow */
    0,	/* Page Down */
    0,	/* Insert Key */
    0,	/* Delete Key */
    0,   0,   0,
    0,	/* F11 Key */
    0,	/* F12 Key */
    0,	/* All other keys are undefined */
};

void (*g_kb_handler)(unsigned char scancode) = 0;

void kb_handler(struct regs *r)
{
//Variables
    unsigned char scancode;

//Read scancode
    scancode = inb(0x60);

//Check if there is a keyboard handler
    if(g_kb_handler!=0)
    {

    //Call the keyboard handler
        g_kb_handler(scancode);
    }
}

void kb_init()
{
//Install keyboard handler
    irq_install_handler(1,kb_handler);
}

void kb_setkeyboardhandler(void (*handler)(unsigned char scancode))
{
    g_kb_handler=handler;
}

char kb_convertscancodetoascii(unsigned char scancode)
{
//Return ASCII code
    return KB_Layout[scancode];
}
